package com.zhoukx.netty.doubborpc.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.concurrent.Callable;

public class NettyClientHandler extends ChannelInboundHandlerAdapter implements Callable {


    private ChannelHandlerContext context; //  上下文
    private String result;  //返回结果
    private String para;  // 客户端调用发放时,传入的参数

    /**
     *   与服务器连接,创建成功后就会被调用
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("channelActive  被调用");
        // 因为我们在其他方法会使用ctx
        context = ctx;
    }

    /**
     *   收到服务器数据好,调用方法
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public synchronized void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("channelRead  被调用");
        result = msg.toString();
       notify(); // 唤醒等待的线程
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
      ctx.close();
    }

    /**
     *  被代理对象调用,发送数据给服务器,发送完成后
     *   等待被唤醒
     * @return
     * @throws Exception
     */
    @Override
    public synchronized Object call() throws Exception {
        System.out.println("call  被调用");
        context.writeAndFlush(para);
        // 等待channelRead 获取到服务器结果后,唤醒
        wait();
        System.out.println("call  被调用2");

        return result;
    }

    void setPara(String para){
         this.para = para;
    }
}
